package plug.GapTextPlugin;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import Controller.MainController;
import Model.Enonce;
import Model.Exercice;

import view.Fenetre;
import view.Param;

@SuppressWarnings("serial")
public class GapTextPanelEtud extends JPanel implements ActionListener {

	private MainController control;
	private Exercice exo;
	private ArrayList<JTextField> tArray;
	private ArrayList<String> answers;
	private JButton bEnter;

	public GapTextPanelEtud(MainController control, Exercice exo) {

		// Initialisation des variables
		this.control = control;
		this.exo = exo;
		Enonce enonce = exo.getEnonce();
		String text = exo.getCorrection().getContenu();
		tArray = new ArrayList<JTextField> (10);		// Tableau des zones de saisie
		answers = new ArrayList<String> ();				// Tableau des reponses
		String subText = "";							// Morceaux de texte (decoupage)

		// Alignement vertical des conteneurs
		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

		// Creation des conteneurs
		bEnter = new JButton("Valider");
		JPanel pPhrases = new JPanel();
		JPanel pLine = new JPanel();
		
		// Ajout de la transparence
		this.setOpaque(false);
		pPhrases.setOpaque(false);
		pLine.setOpaque(false);

		// Ajustements du panel de phrases
		pPhrases.setLayout(new BoxLayout(pPhrases, BoxLayout.Y_AXIS));

		// Ajout des conteneurs
		this.add(new JLabel(enonce.getContenu()));

		for (int i=0; i<text.length(); i++) {

			if (text.charAt(i) != '\n') {

				if (text.charAt(i) != '[') { // Si on ne trouve pas de balise

					subText += text.charAt(i);

				}
				else { // Si on trouve une balise

					// Ajout et reinitialisation du morceau de texte
					pLine.add(new JLabel(subText));
					subText = "";

					// Creation et ajout d'une zone de saisie
					tArray.add(new JTextField(10));
					pLine.add(tArray.get(tArray.size()-1));

					i++;
					String t = "";

					while (text.charAt(i) != ']') { // Tant qu'on n'a pas trouve de balise fermante

						t += text.charAt(i);
						i++;

					}

					answers.add(t);

				}

			}
			else {

				pLine.add(new JLabel(subText));
				subText = "";

				pPhrases.add(pLine);
				pLine = new JPanel();
				pLine.setOpaque(false);

			}

		}

		this.add(pPhrases);
		this.add(bEnter);

		// Ajout des marges
		pPhrases.setBorder(Param.wideMargin);

		// Ajout des ecouteurs aux boutons
		bEnter.addActionListener(this);

	}

	/**Cette methode nettoie une chaine de caracteres des espaces inutiles.**/
	public String cleanSpace(String text) {

		String new_text = "";
		int start = 0;
		int end = text.length();

		if (text.startsWith(" ")) { // Si le texte saisi commence par des espaces vides

			while (text.charAt(start) == ' ') {
				start++;
			}

		}

		if (text.endsWith(" ")) { // Si le texte saisi finit par des espaces vides

			while (text.charAt(end-1) == ' ') {
				end--;
			}

		}

		for (int i=start; i<end; i++) {

			// Si on n'a pas deux espaces vides consecutifs
			if (text.charAt(i) != ' ' || ( i+1<end && text.charAt(i+1) != ' ' ) ) {
				new_text += text.charAt(i);
			}

		}

		return new_text;

	}

	public void actionPerformed(ActionEvent event) {

		if (event.getSource() == bEnter ) {

			bEnter.setEnabled(false);

			int points = 0;

			for (int i=0; i<answers.size(); i++) {

				String cleanText = cleanSpace(tArray.get(i).getText());

				if (cleanText.equals(answers.get(i))) {

					tArray.get(i).setForeground(Param.darkGreenColor);
					points++;

				}
				else {

					tArray.get(i).setForeground(Color.red);
					tArray.get(i).setText(answers.get(i));

				}

			}

			String text = String.valueOf(points) + " / " + String.valueOf(answers.size());

			JLabel lScore = new JLabel(text);
			this.add(lScore);

			Fenetre.fen.validate();

		}

	}

}
